#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <netinet/in.h>
#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

#include <log.h>
#include <config-client.h>
#include <transfert-client.h>
#include <httpserver.h>
#include <tri-fichier.h>
#include <constants.h>

void sigchild_handler(){
	int status;
	wait(&status);
	siginterrupt(SIGCHLD, 0);
	signal(SIGCHLD, sigchild_handler);
	return;
}

void sigterm_http_handler(){
	LogInfo("Arrêt de qube-server/http via sigterm");
	exit(0);
}

void sigterm_report_handler(){
	LogInfo("Arrêt de qube-server/report via sigterm");
	exit(0);
}

main(){
	LogRedirect(CLIENT_LOG);
	signal(SIGTERM, sigterm_report_handler);
	LogInfo("Démarrage de qube-client");
		
	ReadConfig();

	ReadServerList();
	LogInfo("Lecture du fichier des serveurs");
	
	CleanDB();
	LogInfo("Nettoyage de la base de données");

	int httpSocket=HttpSocketInit();
	int pid=fork();
	if(pid==-1){
		LogError("Impossible de démarrer le serveur HTTP",4);
	}
	if(pid==0){
		signal(SIGTERM, sigterm_http_handler);
		HttpListenLoop(httpSocket);
	}
	
	pid=fork();
	if (pid<0){
		LogError("Impossible de démoniser qube-client",2);
	}else if(pid>0) exit(0);
	
	siginterrupt(SIGCHLD, 0);
	signal(SIGCHLD, sigchild_handler);
	
	LogInfo("Début du cycle client. Attente avant demande de rapports ...");
	
	for(;;){
		int slp=sleep(ConfReportFrequency());
		while(slp!=0){
			slp=sleep(slp);
		}
		
		pid=fork();
		if(pid==-1){
			LogError("Impossible de démarrer la récupération des rapports",5);
		}else if(pid==0){
			signal(SIGTERM, SIG_IGN);
			GetReportAllServers();
			exit(0);
		}
	}

	exit(0);

}
